package org.finegold.core.netty.props;

import io.netty.channel.WriteBufferWaterMark;
import lombok.Data;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.ConfigurationProperties;

/**
 * WebSocket服务通用配置
 * @author songkaikai
 * @since 2021/1/21
 */
@ConfigurationProperties(prefix = "fine.netty.server-normal")
@ConditionalOnProperty(value = "fine.netty.enabled", havingValue = "true")
@Data
public class ServerNormalProperties {

    /**
     * 连接超时毫秒数，默认值5000毫秒即5秒。
     */
    private Integer connectTimeoutMillis = 5000;

    /**
     * 自动读取
     */
    private Boolean autoRead = true;

    /**
     * 写高水位标记，默认值64KB。如果Netty的写缓冲区中的字节超过该值，Channel的isWritable()返回False
     * 写低水位标记，默认值32KB。当Netty的写缓冲区中的字节超过高水位之后若下降到低水位，则Channel的isWritable()返回True。
     *      写高低水位标记使用户可以控制写入数据速度，从而实现流量控制。推荐做法是：每次调用channl.write(msg)方法首先调用channel.isWritable()判断是否可写。
     */
    private WriteBufferWaterMark writeBufferWaterMark = new WriteBufferWaterMark(32 * 1024, 64 * 1024);

    /**
     * 单线程执行ChannelPipeline中的事件，默认值为True。该值控制执行ChannelPipeline中执行ChannelHandler的线程。如果为Trye，
     * 整个pipeline由一个线程执行，这样不需要进行线程切换以及线程同步，是Netty4的推荐做法；如果为False，ChannelHandler中的处理过程会由Group中的不同线程执行。
     */
    private Boolean singleEventexecutorPerGroup = true;

}
